/************************************ Copyright *********************************
** (C) Copyright 2022-2025 ZHB,China.
** All Rights Reserved.
******************************************************************************
**--------------------------------------------------------------------------**
** @FileName      : peripheral_w25qxx.h
** @Description   : W25Qxx系列存储Flash操作API定义
**--------------------------------------------------------------------------**
** @Author        : zhangb
** @Version       : v1.0
** @Creat Date    : 2025-07-23
**--------------------------------------------------------------------------**
** @Function List : 函数列表
**                  norflash w25qxx初始化           void init_peripheral_w25qxx(void)
**                  读取W25Qxx芯片类型ID            uint16_t read_peripheral_w25qxx_typeID(void)
**                  扇区擦除W25Qxx系列芯片Flash     uint8_t erase_peripheral_w25qxx_sector(uint32_t address)
**                  整片擦除W25QXX存储芯片          uint8_t erase_peripheral_w25qxx_chip(void)
**                  读取W25Qxx存储ReadAddr地址开始的Size长度数据          uint8_t read_peripheral_w25qxx_data(uint32_t ReadAddr, uint8_t* pData, uint32_t Size)
**                  写入数据到W25Qxx存储writeAddr地址                     uint8_t write_peripheral_w25qxx_data(uint32_t writeAddr, uint8_t* pData, uint32_t Size)
**                  测试W25Qxx                                            void peripheral_w25qxx_test(void)
**--------------------------------------------------------------------------**
********************************************************************************/


/* Define to prevent recursive inclusion -------------------------------------*/

#ifndef __PERIPHERAL_W25QXX_H_
#define __PERIPHERAL_W25QXX_H_

#include <stdint.h>

typedef enum {
    TYPE_W25Q80  = 0xEF13, //0XEF13,表示芯片型号为W25Q80  
    TYPE_W25Q16  = 0xEF14, //0XEF14,表示芯片型号为W25Q16    
    TYPE_W25Q32  = 0xEF15, //0XEF15,表示芯片型号为W25Q32  
    TYPE_W25Q64  = 0xEF16, //0XEF16,表示芯片型号为W25Q64 
    TYPE_W25Q128 = 0xEF17, //0XEF97,表示芯片型号为W25Q128 	  
    TYPE_W25Q256 = 0xEF18, //0XEF18,表示芯片型号为W25Q256
} W25QXX_Type_E;

#define W25Qxx_TYPE   TYPE_W25Q128
/**
  * @brief  W25Qxx Configuration
  */
#define W25Qxx_PAGE_SIZE                      256               ///< 每一页256字节
#define W25Qxx_SECTOR_SIZE                    (4*1024)          ///< 每一扇区4KB
#define W25Qxx_BLOCK_SIZE                     (64*1024)         ///< 每一块64KB
#define W25Qxx_CHIP_SIZE                      (16*1024*1024)    ///< 整片芯片大小16MByte

#define W25Qxx_BULK_ERASE_MAX_TIME         250000
#define W25Qxx_SECTOR_ERASE_MAX_TIME       3000
#define W25Qxx_SUBSECTOR_ERASE_MAX_TIME    800
#define W25Qxx_TIMEOUT_VALUE               1000

/// 测试地址
#define W25Qxx_TEST_ADDR                       0


/**
  * @brief  W25Q128FV Commands
  */
/* Reset Operations */
#define RESET_ENABLE_CMD                     0x66
#define RESET_MEMORY_CMD                     0x99

#define ENTER_QPI_MODE_CMD                   0x38
#define EXIT_QPI_MODE_CMD                    0xFF

/* Identification Operations */
#define READ_ID_CMD                          0x90
#define DUAL_READ_ID_CMD                     0x92
#define QUAD_READ_ID_CMD                     0x94
#define READ_JEDEC_ID_CMD                    0x9F

/* Read Operations */
#define READ_CMD                             0x03
#define READ_32BIT_ADDR_CMD                  0x13
#define FAST_READ_CMD                        0x0B
#define DUAL_OUT_FAST_READ_CMD               0x3B
#define DUAL_INOUT_FAST_READ_CMD             0xBB
#define QUAD_OUT_FAST_READ_CMD               0x6B
#define QUAD_INOUT_FAST_READ_CMD             0xEB

/* Write Operations */
#define WRITE_ENABLE_CMD                     0x06
#define WRITE_DISABLE_CMD                    0x04

/* Register Operations */
#define READ_STATUS_REG1_CMD                  0x05
#define READ_STATUS_REG2_CMD                  0x35
#define READ_STATUS_REG3_CMD                  0x15

#define WRITE_STATUS_REG1_CMD                 0x01
#define WRITE_STATUS_REG2_CMD                 0x31
#define WRITE_STATUS_REG3_CMD                 0x11


/* Program Operations */
#define PAGE_PROG_CMD                        0x02
#define PAGE_PROG_32BIT_ADDR_CMD             0x12
#define QUAD_INPUT_PAGE_PROG_CMD             0x32


/* Erase Operations */
#define SECTOR_ERASE_CMD                     0x20
#define SECTOR_ERASE_32BIT_ADDR_CMD          0x21
#define CHIP_ERASE_CMD                       0xC7

#define PROG_ERASE_RESUME_CMD                0x7A
#define PROG_ERASE_SUSPEND_CMD               0x75


/* Flag Status Register */
#define W25Qxx_FSR_BUSY                    ((uint8_t)0x01)    /*!< busy */
#define W25Qxx_FSR_WREN                    ((uint8_t)0x02)    /*!< write enable */
#define W25Qxx_FSR_QE                      ((uint8_t)0x02)    /*!< quad enable */

#define W25Qxx_OK                    ((uint8_t)0x00)
#define W25Qxx_ERROR                 ((uint8_t)0x01)
#define W25Qxx_BUSY                  ((uint8_t)0x02)
#define W25Qxx_TIMEOUT               ((uint8_t)0x03)



/*************************************************************************** 
**------------------------------------------------------------------------**
** @name		: init_peripheral_w25qxx
** @brief		: norflash w25qxx初始化
** @param		: None 参数
** @retva		: None 返回值
** @note		: None 备注
**------------------------------------------------------------------------**
** @author		: zhangbo	2025-07-23
** @version		: V1.0
***************************************************************************/ 
void init_peripheral_w25qxx(void);

/*************************************************************************** 
**------------------------------------------------------------------------**
** @name		: reset_w25qxx
** @brief		: 重启设备芯片
** @param		: None 
** @retva		: None 
** @note		: None 
**------------------------------------------------------------------------**
** @author		: zhangbo	2025-07-23
** @version		: V1.0
***************************************************************************/ 
void reset_w25qxx(void);

/*************************************************************************** 
**------------------------------------------------------------------------**
** @name		: read_peripheral_w25qxx_typeID
** @brief		: 读取W25Qxx芯片类型ID
** @param		: None
** @retva		: 芯片类型ID值
** @note		: None
**------------------------------------------------------------------------**
** @author		: zhangbo	2025-07-23
** @version		: V1.0
***************************************************************************/ 
uint16_t read_peripheral_w25qxx_typeID(void);

/*************************************************************************** 
**------------------------------------------------------------------------**
** @name		: erase_peripheral_w25qxx_block
** @brief		: 扇区擦除W25Qxx系列芯片Flash
** @param		: address   W25Qxx芯片存储地址所在的扇区
** @retva		: 成功：W25Qxx_OK  失败：W25Qxx_TIMEOUT
** @note		: None
**------------------------------------------------------------------------**
** @author		: zhangbo	2025-07-24
** @version		: V1.0
***************************************************************************/ 
uint8_t erase_peripheral_w25qxx_sector(uint32_t address);

/*************************************************************************** 
**------------------------------------------------------------------------**
** @name		: erase_peripheral_w25qxx_chip
** @brief		: 整片擦除W25QXX存储芯片
** @param		: None
** @retva		: 成功：W25Qxx_OK  失败：W25Qxx_TIMEOUT
** @note		: None
**------------------------------------------------------------------------**
** @author		: zhangbo	2025-07-24
** @version		: V1.0
***************************************************************************/ 
uint8_t erase_peripheral_w25qxx_chip(void);
    

/*************************************************************************** 
**------------------------------------------------------------------------**
** @name		: read_peripheral_w25qxx_data
** @brief		: 读取W25Qxx存储ReadAddr地址开始的Size长度数据
** @param		: ReadAddr      存储地址
** @param		: pData         待读取数据的指针缓冲区
** @param		: Size          待读取数据的长度
** @retva		: 成功：W25Qxx_OK
** @note		: None 备注
**------------------------------------------------------------------------**
** @author		: zhangbo	2025-07-24
** @version		: V1.0
***************************************************************************/ 
uint8_t read_peripheral_w25qxx_data(uint32_t ReadAddr, uint8_t* pData, uint32_t Size);

/*************************************************************************** 
**------------------------------------------------------------------------**
** @name		: page_program_peripheral_w25qxx
** @brief		: 页编程写入w25qxx
** @param		: writeAddr     待写入数据的存储地址
** @param		: pData         待写入数据的指针缓冲区
** @param		: Size          待写入数据的长度
** @retva		: 成功：W25Qxx_OK
** @note		: None 备注
**------------------------------------------------------------------------**
** @author		: zhangbo	2025-07-24
** @version		: V1.0
***************************************************************************/ 
uint8_t page_program_peripheral_w25qxx(uint32_t writeAddr, uint8_t* pData, uint32_t Size);

/*************************************************************************** 
**------------------------------------------------------------------------**
** @name		: write_peripheral_w25qxx_data
** @brief		: 写入数据到W25QXX存储芯片
** @param		: writeAddr     待写入数据的存储地址
** @param		: pData         待写入数据的指针缓冲区
** @param		: Size          待写入数据的长度
** @retva		: 成功：W25Qxx_OK
**------------------------------------------------------------------------**
** @author		: zhangbo	2025-07-24
** @version		: V1.0
***************************************************************************/ 
uint8_t write_peripheral_w25qxx_data(uint32_t writeAddr, uint8_t* pData, uint32_t Size);


/*************************************************************************** 
**------------------------------------------------------------------------**
** @name		: peripheral_w25qxx_test
** @brief		: 测试w25qxx
** @param		: None
** @retva		: None
** @note		: None
**------------------------------------------------------------------------**
** @author		: zhangbo	2025-07-24
** @version		: V1.0
***************************************************************************/ 
void peripheral_w25qxx_test(void);
#endif


/******************************** END OF FILE *********************************/




